package string.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 双映射解决模式匹配问题
 * https://leetcode-cn.com/problems/word-pattern/
 * @author yuisama
 * @date 2022/01/15 21:44
 **/
public class Num290 {
    // 双映射问题
    // 这道题比较巧妙的一种思路是
    // 中国人说中文，法国人说法语
    // 咋样知道他俩说的是相同的内容呢？
    // 是的，让他俩都说英文即可。这个题我们让模式串和字符串s都翻译为int
    public boolean wordPattern(String pattern, String s) {
        // 先将s按照空格拆分
        String[] ret = s.split(" ");
        // 若ret的长度与pattern长度都不相等，一定不是相同内容
        if (ret.length != pattern.length()) {
            return false;
        }
        // 先建立ret和count的映射关系
        int count = 1;
        Map<String,Integer> map = new HashMap<>();
        // sb1存储字符串str翻译成的数字
        StringBuilder sb1 = new StringBuilder();
        for (String s1 : ret) {
            if (map.containsKey(s1)) {
                sb1.append(map.get(s1));
            }else {
                map.put(s1,count);
                sb1.append(count ++);
            }
        }
        count = 1;
        Map<Character,Integer> map1 = new HashMap<>();
        // sb2存储模式串翻译成的数字
        StringBuilder sb2 = new StringBuilder();
        for (int i = 0; i < pattern.length(); i++) {
            char c = pattern.charAt(i);
            if (map1.containsKey(c)) {
                sb2.append(map1.get(c));
            }else {
                map1.put(c,count);
                sb2.append(count ++);
            }
        }
        return sb1.toString().equals(sb2.toString());
    }
}